#include <stdio.h>
#include <stdlib.h>
#define Src_File "/home/richard/LinuxTest/baseIO/hello.txt"
#define Des_File "/home/richard/LinuxTest/baseIO/test.txt"
int main()
{
    FILE *fp1, *fp2;
    char buf[1024];
    int n;
    if ((fp1 = fopen(Src_File, "rb")) == NULL)
    {
        printf("fail to open source file\n");
        exit(1);
    }
    if ((fp2 = fopen(Des_File, "wb")) == NULL)
    {
        printf("fail to open dec file\n");
        exit(1);
    }
    //内存溢出的操作，让你体验finalshell全是乱码
    //    while ((n = fread(buf, sizeof(char), 1024, fp1) > 0))
    //{
    //    if (fwrite(buf, sizeof(char), 1024, fp2) == -1)
    //这里使用了一个固定大小的缓冲区 buf，大小为 1024 字节。如果实际读取的字节数小于缓冲区大小，剩余的缓冲区数据可能包含无效字符，导致写入目标文件时出现乱码。
    while ((n = fread(buf, sizeof(char), 1024, fp1)) > 0)
    {
        if (fwrite(buf, sizeof(char), n, fp2) == -1)
        {
            printf("fail to write\n");
            exit(1);
        }
    }
    if (n == -1)
    {
        printf("fail to read\n");
        exit(1);
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
}

//缓冲区大小的设置可能导致终端显示乱码的问题。
//在该代码中，每次从源文件读取 1024 字节的数据，并将其写入目标文件。如果目标文件是文本文件，
//并且其中包含多字节字符（如 UTF-8 编码的字符），那么终端可能无法正确处理这些字符，导致乱码的显示。
//当终端尝试显示缓冲区中的内容时，它可能会假设每个字节都是单独的字符，并尝试根据当前的字符编码进行解释。
//由于在缓冲区中存在多字节字符，终端可能会错误地将多个字节解释为单个字符，导致乱码的显示。
//在关闭终端或重新启动后，终端的状态会重置，因此乱码问题可能会暂时消失。但是，当再次运行程序并读取并显示缓冲区的内容时，乱码问题可能再次出现。

//综上得出缓冲区溢出而不是内存溢出